#include "global.h"

/**
 * 分析接收到的遥控数据并更新相关参数。
 *
 * 功能描述：
 * 1. 通过 nrf24l01_readData 函数读取接收到的数据。
 * 2. 如果数据读取成功且长度正确：
 *    - 更新 txRemote 数据结构。
 *    - 调用多个函数更新 PID 参数及相关变量。
 *    - 发送确认数据（ACK）。
 *    - 重置超时计数器。
 * 3. 如果数据读取失败或超时：
 *    - 重置 txRemote 数据结构中的关键参数。
 *    - 返回 ERROR 表示数据丢失。
 *
 * 返回值：
 * - SUCCESS：数据处理成功。
 * - ERROR：数据丢失或处理失败。
 */
uint8_t rxRemote_analysis(void)
{
    static uint16_t timeoutCounter = 0;
    uint8_t readDataStatus;
    uint8_t rxPayload[32];
    uint8_t rxPayloadLen;

    readDataStatus = nrf24l01_readData(rxPayload, &rxPayloadLen);
    if (readDataStatus == SUCCESS && rxPayloadLen == sizeof(txRemote))
    {
        // 更新 txRemote 数据结构
        memcpy(&txRemote, rxPayload, rxPayloadLen);
        // 更新 rxRemote 数据结构
        rxRemote.state = flightState;
        rxRemote.roll = imuEulerAngle.roll;
        rxRemote.pitch = imuEulerAngle.pitch;
        rxRemote.yaw = imuEulerAngle.yaw;
        // 发送 ACK 数据
        nrf24l01_setAck((uint8_t *)&rxRemote, sizeof(rxRemote));
        // 重置超时计数器
        timeoutCounter = 0;
    }
    else
    {
        if (++timeoutCounter >= COUNTER1S)
        {
            // 超时情况下重置 txRemote 数据
            txRemote.roll = 0;
            txRemote.pitch = 0;
            txRemote.thr = 0;
            txRemote.yaw = 0;
            txRemote.aux1 = 0;
            txRemote.aux2 = 0;
            txRemote.aux3 = 0;
            txRemote.aux4 = 0;
            // 防止超时计数器溢出
            timeoutCounter = COUNTER1S;
            return ERROR; // 数据丢失
        }
    }
    return SUCCESS; // 数据处理成功
}
